'''v1.0 主要程序
import pandas as pd
import shutil
import os

# 读取CSV文件
# csv_file_path = 'input.csv'
csv_file_path = 'G://相机备份（重大事件前启用）//DCIM_8G//100D5200//8G_100D5200_值得打印-精修的.csv'
# output_folder = 'output_folder/'  # 替换成你的目标文件夹路径
output_folder = r'G://相机备份（重大事件前启用）//letUsSee//'
# source_folder = 'source_folder/'  # 替换成包含所有文件的源文件夹路径
source_folder = r'G://相机备份（重大事件前启用）//DCIM_8G//100D5200//'

# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)

# 读取CSV文件并获取第一列的数据
df = pd.read_csv(csv_file_path)
file_numbers = df.iloc[:, 0].astype(str)  # 确保数字是字符串格式，以便后续匹配

# 遍历源文件夹中的所有文件
for filename in os.listdir(source_folder):
    # 检查文件名是否包含CSV文件中的任何数字序号
    for file_number in file_numbers:
        if file_number in filename:
            # 构建源文件路径和目标文件路径
            source_file_path = os.path.join(source_folder, filename)
            destination_file_path = os.path.join(output_folder, filename)

            # 使用shutil复制文件
            shutil.copy(source_file_path, destination_file_path)
            print(f"文件 {filename} 已复制到 {destination_file_path}")

print("文件复制完成。")
'''

import tkinter as tk
from tkinter import filedialog, messagebox
import pandas as pd
import shutil
import os
from tkinter import ttk


def copy_files():
    # 获取选择的文件/文件夹路径
    csv_file_path = csv_entry.get()
    source_folder_path = source_entry.get()
    output_folder_path = output_entry.get()

    # 检查路径是否有效
    if not all([os.path.exists(csv_file_path), os.path.exists(source_folder_path)]):
        messagebox.showerror("错误", "请确保选择的CSV文件和源文件夹路径有效。")
        return

    if not os.path.exists(output_folder_path):
        os.makedirs(output_folder_path, exist_ok=True)

        # 读取CSV文件并获取文件序号
    try:
        df = pd.read_csv(csv_file_path, header=None)
        file_numbers = df.iloc[:, 0].astype(str)
        progress_bar['value'] = 0  # 初始化进度条为0
        progress_bar['maximum'] = len(file_numbers)+1  # 设置进度条的最大值为CSV的总行数
    except Exception as e:
        messagebox.showerror("错误", f"读取CSV文件时出错: {e}")
        return

        # 复制文件
    try:
        for file_number in file_numbers:
            image_extensions = {
                '.jpg', '.jpeg',  # JPEG格式的图片
                '.png',  # PNG格式的图片
                '.bmp',  # BMP格式的图片
                '.gif',  # GIF格式的图片（通常用于动画）
                '.tiff', '.tif',  # TIFF格式的图片（常用于高质量图像）
                '.webp',  # WebP格式的图片（由Google开发，用于网页）
                '.heic', '.heif',  # HEIF格式的图片（高效图像文件格式，常用于iOS设备）
                '.psd',  # Photoshop的源文件格式
                '.svg',  # 可缩放矢量图形格式
                '.ico',  # 图标文件格式
                '.jfif',  # JPEG File Interchange Format
                '.raw',  # 原始图像格式（常用于相机）
                '.dng',  # Adobe Digital Negative (常用于专业相机)
                '.cr2', '.crw',  # Canon Raw格式
                '.nef',  # Nikon Raw格式
                '.orf',  # Olympus Raw格式
                '.arw',  # Sony Raw格式
                '.rw2',  # Panasonic Raw格式
                '.pef',  # Pentax Raw格式
                '.srf',  # Samsung Raw格式
                '.x3f',  # Fujifilm Raw格式
                '.raf',  # Fujifilm Raw格式（另一种）
                '.indd',  # Adobe InDesign文件格式（虽然不是纯图片格式，但常包含图片）
                '.eps',  # Encapsulated PostScript格式（常用于打印）
                '.ai',  # Adobe Illustrator文件格式（矢量图形）
                '.drw',  # CorelDRAW文件格式（矢量图形）
                '.indd',  # Adobe InDesign文件格式（排版软件，可能包含图片）
                # 注意：像.indd和.ai这样的文件虽然可以包含图片，但它们本身不是图片格式，而是图形设计软件的文件格式。
                # 在筛选图片时，通常不会包括这些格式，除非你明确知道需要处理这些文件中的嵌入图片。
            }
            image_fileNames = [f for f in os.listdir(source_folder_path) if os.path.splitext(f)[1].lower() in image_extensions]
            for filename in image_fileNames:
                if file_number in filename:
                    source_file_path = os.path.join(source_folder_path, filename)
                    destination_file_path = os.path.join(output_folder_path, filename)
                    shutil.copy(source_file_path, destination_file_path)  # 如果需要复制文件，请取消注释此行
                    output_text.insert(tk.END, f"文件 {filename} 已复制到 {destination_file_path}\n")
                    progress_bar.step(1)
                    root.update()
                    root.update_idletasks()  # 更新UI
                    # break  # 找到匹配项后不应该跳出内部循环，因为可能有多个文件包含关键词
        progress_bar.step(0.9)
        output_text.insert(tk.END, "文件复制完成。\n")
    except Exception as e:
        messagebox.showerror("错误", f"复制文件时出错: {e}")

    # 创建主窗口


root = tk.Tk()
root.title("文件复制工具 - 根据CSV序号复制文件")

# 创建文件/文件夹选择框和文本框
csv_label = tk.Label(root, text="选择CSV文件:")
csv_entry = tk.Entry(root)
csv_resetBtn = tk.Button(root, text="清除", command=lambda: csv_entry.delete(0, tk.END))
csv_button = tk.Button(root, text="浏览", command=lambda: csv_entry.insert(0,filedialog.askopenfilename(title="",filetypes=[("CSV files","*.csv")])))


source_label = tk.Label(root, text="选择源文件夹:")
source_entry = tk.Entry(root)
source_resetBtn = tk.Button(root, text="清除", command=lambda: source_entry.delete(0, tk.END))
source_button = tk.Button(root, text="浏览", command=lambda: source_entry.insert(0,filedialog.askdirectory()))

output_label = tk.Label(root, text="选择输出文件夹:")
output_entry = tk.Entry(root)
output_resetBtn = tk.Button(root, text="清除", command=lambda: output_entry.delete(0, tk.END))
output_button = tk.Button(root, text="浏览", command=lambda: output_entry.insert(0,filedialog.askdirectory()))

output_text = tk.Text(root, height=10, width=50)
copy_button = tk.Button(root, text="复制文件", command=copy_files)

progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(root, variable=progress_var, orient='horizontal', length=200, mode='determinate')

# 布局组件
csv_label.grid(row=0, column=0, sticky="e")
csv_entry.grid(row=0, column=1)
csv_button.grid(row=0, column=2)
csv_resetBtn.grid(row=0, column=3)

source_label.grid(row=1, column=0, sticky="e")
source_entry.grid(row=1, column=1)
source_button.grid(row=1, column=2)
source_resetBtn.grid(row=1, column=3)

output_label.grid(row=2, column=0, sticky="e")
output_entry.grid(row=2, column=1)
output_button.grid(row=2, column=2)
output_resetBtn.grid(row=2, column=3)

output_text.grid(row=3, column=0, columnspan=4, sticky="nsew")
copy_button.grid(row=4, column=0)
progress_bar.grid(row=4, column=1, columnspan=3)

# 运行主循环
root.mainloop()

